﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoDatos;

namespace BussinessLogic
{
    /// <summary>
    /// 
    /// </summary>
    public class Lugares
    {
        #region Miembros
        private int _id;


        private TipoLugar _tipoLugar;
        private string _nombre;
        private int _idLugarPadre;
        private List<Lugare> _lugares = null;

        public List<Lugare> AllLugares
        {
            get { return _lugares; }
            set { _lugares = value; }
        }

        #endregion


        #region Constructor

        public Lugares()
        {
            Inicializar();
        }




        private void Inicializar()
        {
            _lugares = FabricaContexto.Contexto.Lugares.ToList();
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        public Lugares(int id, Lugares lugare)
        {
            if (lugare != null)
            {
                _id = id;
                Inicializar();
                Lugare lugar = lugare.AllLugares.Find(p => p.Id == _id);
                if (lugar == null) return;
                _idLugarPadre = lugar.IdLugarPadre.Value;
                _tipoLugar = (TipoLugar)lugar.IdTipoLugar;
                _nombre = lugar.Nombre;
            }
            else
            {
                _id = id;
                Inicializar();
                Lugare lugar = _lugares.Find(p => p.Id == _id);
                if (lugar == null) return;
                _idLugarPadre = lugar.IdLugarPadre.Value;
                _tipoLugar = (TipoLugar)lugar.IdTipoLugar;
                _nombre = lugar.Nombre;
            }
        }
        #endregion


        #region Propiedades

        public int Id
        {
            get { return _id; }
        }

        public TipoLugar TipoLugar
        {
            get { return _tipoLugar; }
        }

        public string Nombre
        {
            get { return _nombre; }
        }


        public int IdLugarPadre
        {
            get { return _idLugarPadre; }
        }

        #endregion
        #region Metodos


        /// <summary>
        /// Trae la descripcion completa del lugar, 
        /// en el formato Pais, Municipio, Departamento.
        /// </summary>
        /// <returns></returns>
        public string GetDescripcionLugar()
        {

            switch (_tipoLugar)
            {
                case TipoLugar.Pais:
                    return GetDescripcionPais();

                case TipoLugar.Departamento:
                    return GetDescripcionDepartamento();

                case TipoLugar.Municipio:
                    return GetDescripcionMunicipio();

                default:
                    return string.Empty;

            }

        }


        private string GetFormatLugar(string pais, string departamento, string municipio)
        {
            return string.Format("{0}: {1}, {2}", pais, departamento, municipio);
        }


        private string GetDescripcionMunicipio()
        {
            if (_id < 0) return "Seleccione...";
            Lugare departamentoLugar = _lugares.Find(lugar => lugar.Id == _idLugarPadre);
            string departamento = departamentoLugar.Nombre;
            string pais = _lugares.Find(lugar => lugar.Id == departamentoLugar.IdLugarPadre).Nombre;
            string municipio = _nombre;
            return GetFormatLugar(pais, departamento, municipio);

        }



        private string GetDescripcionDepartamento()
        {
            string departamento = _nombre;
            if (_id < 0) return string.Empty;
            string pais = _lugares.Find(lugar => lugar.Id == _idLugarPadre).Nombre;
            string municipio = _lugares.Find(lugar => lugar.IdLugarPadre == _id).Nombre;
            return GetFormatLugar(pais, departamento, municipio);
        }

        private string GetDescripcionPais()
        {
            string pais = _nombre;
            if (_id < 0) return string.Empty;
            Lugare departamentoLugar = _lugares.Find(lugar => lugar.IdLugarPadre == _id); ;
            string departamento = departamentoLugar.Nombre;
            string municipio = _lugares.Find(lugar => lugar.IdLugarPadre == departamentoLugar.Id).Nombre;
            return GetFormatLugar(pais, departamento, municipio);
        }





        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public List<Lugare> GetPaises()
        {
            IEnumerable<Lugare> lugaresEncontrados = _lugares.Where(lugar => lugar.IdTipoLugar == (int)TipoLugar.Pais);
            if (lugaresEncontrados == null) return new List<Lugare>();
            List<Lugare> lugares = new List<Lugare>();
            return new List<Lugare>(lugaresEncontrados);
        }


        /// <summary>
        /// GetLugareById
        /// </summary>
        /// <param name="idLugarPadre"></param>
        /// <param name="lugares"></param>
        /// <returns></returns>
        public Lugare GetLugarById(int id)
        {
            IEnumerable<Lugare> lugaresEncontrados = _lugares.Where(lugar => lugar.Id == id);
            if (lugaresEncontrados == null) return null;
            return lugaresEncontrados.First();
        }


        /// <summary>
        /// GetLugareById
        /// </summary>
        /// <param name="idLugarPadre"></param>
        /// <param name="lugares"></param>
        /// <returns></returns>
        public Lugare GetLugarById(int idLugarPadre, int id)
        {
            IEnumerable<Lugare> lugaresEncontrados = _lugares.Where(lugar => lugar.Id == id);
            if (lugaresEncontrados == null) return null;
            return lugaresEncontrados.First();
        }

        /// <summary>
        /// GetLugaresByPadre
        /// </summary>
        /// <param name="idLugarPadre"></param>
        /// <param name="lugares"></param>
        /// <returns></returns>
        public List<Lugare> GetLugaresByPadre(int idLugarPadre)
        {
            IEnumerable<Lugare> lugaresEncontrados = _lugares.Where(lugar => lugar.IdLugarPadre == idLugarPadre);
            if (lugaresEncontrados == null) return new List<Lugare>();
            return new List<Lugare>(lugaresEncontrados);
        }

        public IEnumerable<ItemListaLugar> GetItemsLugarByPadre(int idLugarPadre)
        {
            List<ItemListaLugar> items = new List<ItemListaLugar>();
            IEnumerable<Lugare> lugaresEncontrados = _lugares.Where(lugar => lugar.IdLugarPadre == idLugarPadre);
            if (lugaresEncontrados == null) return items;

            foreach (var item in lugaresEncontrados)
            {
                items.Add(new ItemListaLugar(item.Id.ToString(), item.Nombre));                
            }
            return items;

        }

        #endregion
    }
}
